package com.example.study2.ThisReference;

/**
 * 超级简单的例子：一个人去银行开户
 * 补充使用场景：在方法中传递当前对象
 */

// 银行类 - 负责处理开户业务
class Bank {
    /**
     * 开户方法
     * @param person 要开户的人（就是通过this传递过来的）
     */
    public static void openAccount(Person person) {
        // 这里接收到的person，就是调用方法时传递的this
        System.out.println("银行：正在为 " + person.name + " 办理开户...");
        System.out.println("银行：确认年龄 " + person.age + " 岁，可以开户");
        System.out.println("银行：开户成功！");
    }
}

// 人类 - 代表要去开户的人
class Person {
    String name;  // 姓名
    int age;      // 年龄

    // 构造方法：创建一个人
    public Person(String name, int age) {
        this.name = name;  // this.name = 当前对象的name属性
        this.age = age;    // this.age = 当前对象的age属性
    }

    /**
     * 去银行开户的方法
     * 关键：把"我自己"(this)传递给银行
     */
    public void goToBank() {
        // this 就是"当前调用这个方法的那个对象"
        // 比如：张三.goToBank()，this就是张三
        // 比如：李四.goToBank()，this就是李四

        System.out.println(name + " 来到银行");

        // 把"我自己"(this)告诉银行，让银行为我服务
        Bank.openAccount(this);
        // 相当于说："银行，请为【我这个人】开户"
    }
}

/**
 * 测试类
 */
public class SimpleExample {
    public static void main(String[] args) {
        // 创建两个人
        Person 张三 = new Person("张三", 25);  // this指向张三
        Person 李四 = new Person("李四", 17);  // this指向李四

        System.out.println("=== 张三去银行 ===");
        张三.goToBank();
        // 执行时：张三的this传递给Bank.openAccount方法
        // 相当于 Bank.openAccount(张三);

        System.out.println("\n=== 李四去银行 ===");
        李四.goToBank();
        // 执行时：李四的this传递给Bank.openAccount方法
        // 相当于 Bank.openAccount(李四);
    }
}

/*
运行结果：
        === 张三去银行 ===
        张三 来到银行
        银行：正在为 张三 办理开户...
        银行：确认年龄 25 岁，可以开户
        银行：开户成功！

        === 李四去银行 ===
        李四 来到银行
        银行：正在为 李四 办理开户...
        银行：确认年龄 17 岁，可以开户
        银行：开户成功！
*/
